package com.time.doudou.realip.controller;

import com.time.doudou.realip.util.IPUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

/**
 * @author yonghao.tang
 * @version 1.0.0
 * @ClassName HomeController.java
 * @Description TODO
 * @createTime 2023年02月04日 19:12:00
 */
@Slf4j
@RestController
public class HomeController {

    /**
     * X-Real-IP
     * 在《实战nginx》中，有这么一句话：
     * 经过反向代理后，由于在客户端和web服务器之间增加了中间层，因此web服务器无法直接拿到客户端的ip，通过$remote_addr变量拿到的将是反向代理服务器的ip地址。
     * 这句话的意思是说，当你使用了nginx反向服务器后，在web端使用request.getRemoteAddr()(本质上就是获取$remote_addr)
     * ，取得的是nginx的地址，即$remote_addr变量中封装的是nginx的地址，当然是没法获得用户的真实ip的。但是，nginx是可以获得用户的真实ip的，
     * 也就是说nginx使用$remote_addr变量时获得的是用户的真实ip，如果我们想要在web端获得用户的真实ip，就必须在nginx里作一个赋值操作，即我在上面的配置：
     *
     * @return
     */
    @GetMapping("ip")
    public String getIpAddress(HttpServletRequest request) {
        String IP = IPUtils.getIpAddress(request);
        log.info("getIpAddress IP:[{}]", IP);
        return IP;
    }

    @GetMapping("ip2")
    public String getIpAddress2(HttpServletRequest request) {
        String IP = IPUtils.getClientIpAddress(request);
        log.info("getIpAddress2 IP:[{}]", IP);
        return IP;
    }
}
